home *** CD-ROM | disk | FTP | other *** search
/ Chip 1996 April / CHIP 1996 aprilis (CD06).zip / CHIP_CD06.ISO / hypertxt.arj / 9407 / LDALL2.CD < prev    next >
Text File  |  1994-11-27  |  13KB  |  246 lines

  1.           @VA LOADALL utasítás@N
  2.  
  3.           @Vavagy, a memóriakezelés rejtelmei...@N
  4.  
  5.           Az  IBM  PC/XT/AT  számítógépek  memóriakezelése  nem  éppen
  6.           a   legjobbak   közül   való.   Valós   címzési  módban  640
  7.           Kbyte  hagyományos (DOS-) és 384 Kbyte felsô (upper) memória
  8.           címezhetô   közvetlenül.   A   fennmaradó   memóriaterületet
  9.           alapesetben  extendedként  könyvelhetjük  el, s jobb esetben
  10.           programjaink adattárolásra használhatják... Vagy mégsem?
  11.  
  12.  
  13.  
  14.           Az  alábbiakban  egy  nem dokumentált utasítást mutatunk be,
  15.           amely  lehetôvé  teszi  80286/80386/80486-os  gépeken,  hogy
  16.           valós  címzési  módban elérjük a teljes memóriatartományt, s
  17.           ott  programot  is  futtassunk. Ez az utasítás a LOADALL. Az
  18.           utasítás  kódja  80286-os  processzoron hexadecimális 0F 05,
  19.           míg  80386/80486-os  processzoron  hexadecimális  0F  07.  A
  20.           neve  arra  utal,  hogy  ezzel  az  utasítással a processzor
  21.           összes regiszterét feltölthetjük.
  22.  
  23.           Az   utasítás   feladata   a  processzor  úgynevezett  cache
  24.           regisztereinek    gyors    inicializálása.    Ilyen    cache
  25.           regiszterek     a    80286/80386/80486-os    processzorokban
  26.           találhatók.  Az  Intel  hivatalos dokumentációjában említést
  27.           tesz  a  cache  regiszter felépítésérôl, de hiányosan említi
  28.           azokat  a  regisztereket,  amelyeknek  van cache regisztere.
  29.           Az  utasítást, amellyel hozzáférhetnénk ezekhez, nem említi,
  30.           sôt tagadja, hogy létezik ilyen. Vajon miért?
  31.  
  32.  
  33.                               @VCache regiszter@N
  34.  
  35.           A  cache  regiszter  a  processzor  belsô  regisztere, amely
  36.           három  részre  van  osztva.  Sorrendben  a szegmenshosszt, a
  37.           fizikai   szegmens-kezdôcímet,   és  a  hozzáférési  byte-ot
  38.           tartalmazza.
  39.  
  40.           A   fizikai   szegmenscím   a  szegmens  fizikai  kezdôcímét
  41.           határozza  meg  a  memóriában.  A  szegmenshossz  a szegmens
  42.           kezdettôl  számított hosszát határozza meg byte-okban, míg a
  43.           hozzáférési  byte  a  védett  módú  mûködés  során a védelmi
  44.           szint   információkat   tartalmazza.   (A   cache  regiszter
  45.           felépítését a kiemelt szövegrészben láthatják.)
  46.  
  47.           Többféle   cache   regiszter   van.   Most  azonban  csak  a
  48.           szegmensleíró  cache regisztereket tartjuk szem elôtt, mivel
  49.           a   memóriacímzéshez   erre   van   szükségünk.  A  80x86-os
  50.           architektúrában            ismeretesek           úgynevezett
  51.           szegmensregiszterek,  például  a  CS, a DS, az ES, és az SS.
  52.           Mindegyik  szegmensregiszternek  van saját cache regisztere,
  53.           amit  a  processzor  tölt  fel  értékkel a szegmensregiszter
  54.           alapján.  Ha  például  a  DS regiszterbe hexadecimális 03F43
  55.           értéket  töltünk,  akkor  a  hozzá  tartozó  cache regiszter
  56.           fizikai  szegmenscím  mezôjébe  hexadecimális  03F430  érték
  57.           kerül.  Mivel  azonban a szegmensregiszterekbe valós címzési
  58.           módban  csak maximum hexadecimális 0FFFF érték tölthetô, így
  59.           nem  tudjuk  elérni  az  @K1  Mbyte+64  Kbyte-16  byte@N feletti
  60.           területet.  Pontosabban  fogalmazva,  csak  a  8086/80286-os
  61.           processzorok    nem    tudják   elérni.   A   80386/80486-os
  62.           processzorok  a  32  bites  indexregiszterek  (EBX, ESI, EDI
  63.           stb.)   használatával  valós  módban  is  kezelik  a  teljes
  64.           memóriaterületet, példa erre a HIMEM.SYS eszközmeghajtó.
  65.  
  66.           Gondolom,   ezek   után  részletezni  sem  érdemes,  hogy  a
  67.           80386/80486-os  processzoroknál  az  @KIP@N  valós  módban is 32
  68.           bites,   s   a  használata  is  lehetséges.  Ha  a  80286-os
  69.           processzornak   lenne  32  bites  indexregisztere,  akkor  a
  70.           teljes   memóriaterület   címzésére  is  képes  lenne  valós
  71.           módban,  de  mivel  nincs...  Mivel  nincs,  marad a LOADALL
  72.           utasítás,  amellyel  közvetlenül  a  cache regiszter fizikai
  73.           szegmenscím mezôjébe tölthetjük a szegmenscímet.
  74.  
  75.           Mivel  a cache regiszter valósítja meg a valódi címzést, így
  76.           a    hozzátartozó    szegmensregiszterbe   bármilyen   érték
  77.           tölthetô.  A  cache  regiszterben  a  következô hozzátartozó
  78.           szegmensregiszter  hozzáférésig  marad  a  betöltött  érték,
  79.           azaz,  ha a DS szegmensregiszter cache regiszterének fizikai
  80.           szegmenscím  mezôjébe  hexadecimális 200000 értéket töltünk,
  81.           akkor  a  DS  regiszter a 2 Mbyte-os címre mutat addig, amíg
  82.           például  egy  @KPOP  DS@N  utasítás  végrehajtásra  nem kerül. A
  83.           továbbiakban  az  indexregiszterek  segítségével közvetlenül
  84.           címezhetjük  ezt a területet. Ugyanez igaz a többi, így a CS
  85.           szegmensregiszterre  is.  Megjegyzendô,  hogy a megszakítási
  86.           vektortábla   a   szokásos   méretû   marad,   de   az  @KLIDT@N
  87.           utasítással    megváltoztathatjuk   az   elhelyezkedését   a
  88.           memóriában.
  89.  
  90.  
  91.                            @VGyakorlati alkalmazás@N
  92.  
  93.           A  LOADALL  utasítás mûködési mechanizmusa mind a három fent
  94.           említett    processzortípuson   azonos,   bár   a   80286-os
  95.           processzorú  alkalmazásnál  némi  technikai  különbség van a
  96.           80386/80486-hoz képest.
  97.  
  98.           Elsô  lépésként  egy  táblázatot  kell létrehoznunk, amely a
  99.           regiszterek  és  cache  regiszterek  értékeit  tartalmazza a
  100.           LOADALL  utasítás  számára.  (Lásd  @VA  80286  LOADALL esetén@N
  101.           @Vkészítendô  táblázat felépítése,@N  illetve  a  @VA  80386/80486@N
  102.           @VLOADALL   esetén   készítendô   táblázat   felépítése@N   címû
  103.           keretes  szövegrészünket!)  A táblázat kitöltésénél vigyázni
  104.           kell  néhány  apróságra.  Elsôként  a  gépi  státusz  szó, a
  105.           @KMSW@N   vagy   @KCR0@N   0.   bitjére   figyeljünk,   mivel  ez  a
  106.           @Kvédett  mód@N  kapcsoló.  Abban  az  esetben,  ha valós módban
  107.           szeretnénk  használni a LOADALL-t, a 0. bitet 0-ra állítsuk!
  108.           A  másik  fontos  regiszter  az  @KIP@N,  amely meghatározza azt
  109.           a  helyet,  ahol  a  program  folytatódik a LOADALL utasítás
  110.           végrehajtása  után.  A  @KCS@N  regiszterbe  töltött  érték  nem
  111.           kerül  felhasználásra,  mivel  a  @KCS  cache@N  regiszter címzi
  112.           a  kódszegmenst,  így  ez utóbbit kell helyesen kitölteni. A
  113.           többi   szegmensregiszterrel   ugyanígy   ""bánunk   el".  A
  114.           hozzáférési    byte-ot    mindegyik    cache    regiszterben
  115.           hexadecimális  93-mal  kell  feltölteni,  mert  az operációs
  116.           rendszer valós módban a 0-s védelmi szinten fut fixen.
  117.  
  118.           Miután   elkészült  a  táblázat,  80286-os  esetén  át  kell
  119.           másolni  a hexadecimális 0080:0000 címre, mivel a processzor
  120.           csak  errôl  a  címrôl  tudja betölteni. Az ott elhelyezkedô
  121.           adatokat    elôtte    értelemszerûen    el   kell   menteni.
  122.           80386/80486-os  processzor  esetén  a  táblázatot  nem  kell
  123.           másolni,  a  címét  egyszerûen  be  kell  tölteni  az @KES:EDI@N
  124.           regiszterekbe.
  125.  
  126.           Végül  végrehajtjuk a LOADALL utasítást, amely a táblázatban
  127.           található  értékkel tölti fel a hozzájuk tartozó regisztert,
  128.           s  a  program  futását  a  @KCS cache:IP@N címen folytatja, ahol
  129.           tulajdonképpen  egy  speciális  alkalmazás helyezkedik el. A
  130.           HIMEM.SYS  esetében  itt történik az extended memória írása,
  131.           olvasása   egy   @KREP   MOVSB@N  utasítással.  Lehetséges  más,
  132.           teljesen  új  alkalmazási  terület  használata is, hiszen ha
  133.           védett  módba kapcsolunk, a LOADALL segítségével futtahatunk
  134.           valós  módú  programot  védett  módban, illetve készíthetünk
  135.           olyan  nyomkövetôt,  amely nem foglal egyetlen byte-ot sem a
  136.           hagyományos memóriából.
  137.  
  138.           A   80286-os   LOADALL  használata  esetén  ügyelni  kell  a
  139.           hexadecimális     0080:0000    címrôl    elmentett    adatok
  140.           visszamásolására,  mivel  itt néhány ROM BIOS cím található,
  141.           melyeket  az  operációs  rendszer használ belépési pontként.
  142.           A  PC/MS/COMPAQ  DOS  3.x  verzióinál  ezt  a  helyet üresen
  143.           hagyták,  így  nincs  szükség  a terület elmentésére illetve
  144.           visszamásolására.
  145.  
  146.           A   témával   kapcsolatos   példaprogramot   a  CT  BBS  L03
  147.           területérôl lehet letölteni.
  148.  
  149.           Végül   engedtessék   meg   néhány   gondolat  a  fentiekkel
  150.           kapcsolatban.   Nem  tudom,  kinek  mi  jut  eszébe  a  fent
  151.           leírtak    alapján,    számomra    a   tanulság   egy   szó:
  152.           félrevezetés.   Erre   a   vádra   az   okot   a   hivatalos
  153.           dokumentáció   szolgáltatja.   Az   iAPX   80286/80386/80486
  154.           processzorok  leírásában  külön  mesét  találtak  ki a valós
  155.           módú  címzésre,  s  arra, hogy miért nem érik el közvetlenül
  156.           az  extendednek  csúfolt  memóriát, és ráadásként több tucat
  157.           utasítást   sem   tesznek  közzé.  Ez  utóbbit  valószínûleg
  158.           üzleti  megfontolásból  teszik,  saját hasznukra, mellôzve a
  159.           felhasználók érdekeit.
  160.  
  161.  
  162.                        @VA cache regiszter felépítése@N
  163.  
  164.                    @VA 80286-os cache regiszter felépítése@N
  165.  
  166.           5  ->    1 byte   hozzáférési byte
  167.           2  ->    3 byte   szegmens fizikai kezdôcíme
  168.           0  ->    2 byte   szegmenshatár
  169.  
  170.                 @VA 80386/80486-os cache regiszter felépítése@N
  171.  
  172.           11  ->    1 byte   nulla
  173.           10  ->    1 byte   hozzáférési byte
  174.            8  ->    2 byte   nulla
  175.            4  ->    4 byte   szegmens fizikai kezdôcíme (32 bites)
  176.            0  ->    4 byte   szegmenshatár (32 bit)
  177.  
  178.            @VA 80286 LOADALL esetén készítendô táblázat felépítése@N
  179.  
  180.  
  181.           0800: 6 N/A (nem hiszem, hiszen pont olyan hosszú, mint egy cache regiszter)
  182.           0806: 2 MSW (gépi státusz szó)
  183.           0808: 14 N/A (itt vajon mi rejtôzik...)
  184.           0816: 2 TR (taszk regiszter) védett mód esetén
  185.           0818: 2 FLAGS (flagek)
  186.           081a: 2 IP (az új IP)
  187.           081c: 2 LDT (lokális leíró tábla regiszter) védett mód esetén
  188.           081e: 2 DS
  189.           0820: 2 SS
  190.           0822: 2 CS
  191.           0824: 2 ES
  192.           0826: 2 DI
  193.           0828: 2 SI
  194.           082a: 2 BP
  195.           082c: 2 SP
  196.           082e: 2 BX
  197.           0830: 2 DX
  198.           0832: 2 CX
  199.           0834: 2 AX
  200.           0836: 6 ES cache (ES cache regiszter)
  201.           083c: 6 CS cache (CS cache regiszter)
  202.           0842: 6 SS cache (SS cache regiszter)
  203.           0848: 6 DS cache (DS cache regiszter)
  204.           084e: 6 GDTR (globális leíró tábla)
  205.           0854: 6 LDT cache (lokális leíró tábla cache) védett mód esetén
  206.           085a: 6 IDTR (megszakítási leíró tábla)
  207.           0860: 6 TSS cache (taszk szegmens cache) védett mód esetén
  208.  
  209.         @VA 80386/80486 LOADALL esetén készítendô táblázat felépítése@N
  210.  
  211.           Relatív offset  Hossz       Regiszternév:
  212.  
  213.           0000:       4          CR0 (azonos az MSW regiszterrel)
  214.           0004:       4          EFLAGS
  215.           0008:       4          EIP
  216.           000c:       4          EDI
  217.           0010:       4          ESI
  218.           0014:       4          EBP
  219.           0018:       4          ESP
  220.           001c:       4          EBX
  221.           0020:       4          EDX
  222.           0024:       4          ECX
  223.           0028:       4          EAX
  224.           002c:       4          DR6
  225.           0030:       4          DR7
  226.           0034:       4          TR (taszk regiszter)
  227.           0038:       4          LDT (lokális leíró tábla regiszter)
  228.           003c:       4          GS
  229.           0040:       4          FS
  230.           0044:       4          DS
  231.           0048:       4          SS
  232.           004c:       4          CS
  233.           0050:       4          ES
  234.           0054:      12          TSS (taszk státusz szegmens cache)
  235.           0060:      12          IDT (megszakítási leíró tábla cache)
  236.           006c:      12          GDT (globális leíró tábla cache)
  237.           0078:      12          LDT (lokális leíró tábla cache)
  238.           0084:      12          GS cache
  239.           0090:      12          FS cache
  240.           009c:      12          DS cache
  241.           00a8:      12          SS cache
  242.           00b4:      12          CS cache
  243.           00c0:      12          ES cache
  244.  
  245.  
  246.           @KDarvas Årpád@N